package types

import (
	"context"
)

// PluginType 插件类型
type PluginType string

const (
	// PluginTypeWASM WebAssembly插件
	PluginTypeWASM PluginType = "wasm"
	// PluginTypeRPC RPC插件
	PluginTypeRPC PluginType = "rpc"
	// PluginTypeGo Go插件
	PluginTypeGo PluginType = "go"
	// PluginTypeProcess 进程插件
	PluginTypeProcess PluginType = "process"
	// PluginTypeMonitor 监控插件
	PluginTypeMonitor PluginType = "monitor"
)

// PluginStatus 插件状态
type PluginStatus string

const (
	// PluginStatusCreated 已创建
	PluginStatusCreated PluginStatus = "created"
	// PluginStatusInitialized 已初始化
	PluginStatusInitialized PluginStatus = "initialized"
	// PluginStatusRunning 运行中
	PluginStatusRunning PluginStatus = "running"
	// PluginStatusPaused 已暂停
	PluginStatusPaused PluginStatus = "paused"
	// PluginStatusStopped 已停止
	PluginStatusStopped PluginStatus = "stopped"
	// PluginStatusError 错误状态
	PluginStatusError PluginStatus = "error"
)

// PluginConfig 插件配置
type PluginConfig struct {
	// ID 插件ID
	ID string `json:"id"`
	// Name 插件名称
	Name string `json:"name"`
	// Description 插件描述
	Description string `json:"description"`
	// Type 插件类型
	Type PluginType `json:"type"`
	// Version 插件版本
	Version string `json:"version"`
	// Path 插件路径
	Path string `json:"path"`
	// Config 插件配置
	Config map[string]interface{} `json:"config"`
	// Enabled 是否启用
	Enabled bool `json:"enabled"`
}

// Plugin 插件接口
type Plugin interface {
	// ID 返回插件ID
	ID() string

	// Name 返回插件名称
	Name() string

	// Description 返回插件描述
	Description() string

	// Type 返回插件类型
	Type() PluginType

	// Version 返回插件版本
	Version() string

	// Status 返回插件状态
	Status() PluginStatus

	// Config 返回插件配置
	Config() map[string]interface{}

	// Init 初始化插件
	Init(ctx context.Context, config *PluginConfig) error

	// Start 启动插件
	Start(ctx context.Context) error

	// Stop 停止插件
	Stop(ctx context.Context) error

	// Pause 暂停插件
	Pause(ctx context.Context) error

	// Resume 恢复插件
	Resume(ctx context.Context) error

	// Validate 验证插件配置
	Validate(config *PluginConfig) error
}

// PluginExecutor 插件执行器接口
type PluginExecutor interface {
	// Execute 执行插件
	Execute(ctx context.Context, action string, params map[string]interface{}) (map[string]interface{}, error)

	// ExecuteAsync 异步执行插件
	ExecuteAsync(ctx context.Context, action string, params map[string]interface{}) (string, error)

	// GetAsyncResult 获取异步执行结果
	GetAsyncResult(ctx context.Context, executionID string) (map[string]interface{}, error)

	// CancelExecution 取消执行
	CancelExecution(ctx context.Context, executionID string) error
}

// PluginLifecycle 插件生命周期接口
type PluginLifecycle interface {
	// OnInit 初始化回调
	OnInit(ctx context.Context) error

	// OnStart 启动回调
	OnStart(ctx context.Context) error

	// OnStop 停止回调
	OnStop(ctx context.Context) error

	// OnPause 暂停回调
	OnPause(ctx context.Context) error

	// OnResume 恢复回调
	OnResume(ctx context.Context) error

	// OnUninstall 卸载回调
	OnUninstall(ctx context.Context) error
}

// PluginMetadata 插件元数据接口
type PluginMetadata interface {
	// GetName 获取插件名称
	GetName() string

	// GetDescription 获取插件描述
	GetDescription() string

	// GetVersion 获取插件版本
	GetVersion() string

	// GetAuthor 获取插件作者
	GetAuthor() string

	// GetDependencies 获取插件依赖
	GetDependencies() []string

	// GetTags 获取插件标签
	GetTags() []string

	// GetManifest 获取插件清单
	GetManifest() map[string]interface{}
}

// PluginManager 插件管理器接口
type PluginManager interface {
	// RegisterPlugin 注册插件
	RegisterPlugin(plugin Plugin) error

	// UnregisterPlugin 注销插件
	UnregisterPlugin(pluginID string) error

	// GetPlugin 获取插件
	GetPlugin(pluginID string) (Plugin, error)

	// ListPlugins 列出所有插件
	ListPlugins() []Plugin

	// LoadPlugin 加载插件
	LoadPlugin(ctx context.Context, config *PluginConfig) (Plugin, error)

	// UnloadPlugin 卸载插件
	UnloadPlugin(ctx context.Context, pluginID string) error

	// StartPlugin 启动插件
	StartPlugin(ctx context.Context, pluginID string) error

	// StopPlugin 停止插件
	StopPlugin(ctx context.Context, pluginID string) error

	// StartAll 启动所有插件
	StartAll(ctx context.Context) error

	// StopAll 停止所有插件
	StopAll(ctx context.Context) error

	// EnablePlugin 启用插件
	EnablePlugin(pluginID string) error

	// DisablePlugin 禁用插件
	DisablePlugin(pluginID string) error

	// IsPluginEnabled 插件是否已启用
	IsPluginEnabled(pluginID string) bool
}

// PluginLoader 插件加载器接口
type PluginLoader interface {
	// Load 加载插件
	Load(ctx context.Context, config *PluginConfig) (Plugin, error)

	// Unload 卸载插件
	Unload(ctx context.Context, plugin Plugin) error

	// GetSupportedTypes 获取支持的插件类型
	GetSupportedTypes() []PluginType

	// ValidateConfig 验证插件配置
	ValidateConfig(config *PluginConfig) error
}
